const express = require('express');
const cors = require('cors');
require('dotenv').config();

const { testConnection, initializeDatabase } = require('./config/database');

const app = express();
const PORT = process.env.PORT || 3000;

// CORS 配置 - 支持苹果设备和Safari
const corsOptions = {
  origin: function (origin, callback) {
    // 允许本地开发和生产环境
    const allowedOrigins = [
      'http://localhost:3000',
      'http://127.0.0.1:3000',
      'http://0.0.0.0:3000',
      'http://localhost:8080',
      'http://127.0.0.1:8080',
      // 添加你的实际域名
      // 'https://yourdomain.com'
    ];
    
    // 允许无origin的请求（比如移动应用）
    if (!origin) return callback(null, true);
    
    if (allowedOrigins.indexOf(origin) !== -1) {
      callback(null, true);
    } else {
      // 开发环境下允许所有来源
      callback(null, true);
    }
  },
  credentials: true,
  methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
  allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With', 'timestamp'],
  exposedHeaders: ['Content-Disposition']
};

// 中间件
app.use(cors(corsOptions));
app.use(express.json({ limit: '50mb' }));
app.use(express.urlencoded({ extended: true, limit: '50mb' }));

// 静态文件服务
app.use(express.static('public'));
// 提供上传文件的静态访问
app.use('/uploads', express.static('uploads'));

// 导入路由
const userRoutes = require('./routes/users');
const uploadRoutes = require('./routes/upload');
const foodTemplateRoutes = require('./routes/foodTemplates');
const refrigeratorRoutes = require('./routes/refrigerators');
const foodRoutes = require('./routes/foods');
const foodCategoryRoutes = require('./routes/foodCategories');
const goodsRoutes = require('./routes/goods');
const goodsCategoryRoutes = require('./routes/goodsCategories');
const goodsPropertiesRoutes = require('./routes/goodsProperties');

// 使用路由
app.use('/api/users', userRoutes);
app.use('/api/upload', uploadRoutes);
app.use('/api/food-templates', foodTemplateRoutes);
app.use('/api/refrigerators', refrigeratorRoutes);
app.use('/api/foods', foodRoutes);
app.use('/api/food-categories', foodCategoryRoutes);
app.use('/api/goods', goodsRoutes);
app.use('/api/goods-categories', goodsCategoryRoutes);
app.use('/api/goods-properties', goodsPropertiesRoutes);

// 根路由
app.get('/', (req, res) => {
  res.json({ 
    message: 'Node.js 数据库交互项目运行中!',
    database: '已连接到 MySQL 数据库',
    endpoints: {
      'GET /api/users': '获取所有用户',
      'GET /api/users/:id': '获取指定用户',
      'POST /api/users': '创建新用户',
      'PUT /api/users/:id': '更新用户信息',
      'DELETE /api/users/:id': '删除用户',
      'POST /api/upload': '上传文件（支持多文件，最大50MB）',
      'GET /api/upload/list': '获取已上传文件列表',
      'GET /api/upload/download/:filename': '下载文件',
      'DELETE /api/upload/:filename': '删除文件',
      // 食物管理系统 API
      'GET /api/food-templates': '获取所有食物模板',
      'GET /api/food-templates/type/:foodType': '根据食物种类获取模板',
      'GET /api/food-templates/temperature/:temperatureType': '根据温度需求获取模板',
      'GET /api/food-templates/:id': '获取食物模板详情',
      'POST /api/food-templates': '创建食物模板',
      'PUT /api/food-templates/:id': '更新食物模板',
      'DELETE /api/food-templates/:id': '删除食物模板',
      'GET /api/refrigerators': '获取所有冰箱',
      'GET /api/refrigerators/active': '获取活跃状态的冰箱',
      'GET /api/refrigerators/:id': '获取冰箱详情（含食物统计）',
      'POST /api/refrigerators': '创建冰箱',
      'PUT /api/refrigerators/:id': '更新冰箱',
      'DELETE /api/refrigerators/:id': '删除冰箱',
      'GET /api/foods': '获取所有食物',
      'GET /api/foods/refrigerator/:id': '根据冰箱ID获取食物',
      'GET /api/foods/temperature/:status': '根据温度状态获取食物（支持多选，用逗号分隔）',
      'GET /api/foods/filter': '根据冰箱ID和温度状态获取食物（参数可选，默认查询所有）',
      'GET /api/foods/expiring/:days': '获取即将过期的食物',
      'GET /api/foods/expired': '获取已过期的食物',
      'GET /api/foods/reminders': '获取需要提醒的食物',
      'POST /api/foods': '创建食物',
      'POST /api/foods/batch': '批量创建食物',
      'PUT /api/foods/:id': '更新食物',
      'PUT /api/foods/:id/move': '移动食物到其他冰箱',
      'DELETE /api/foods/:id': '删除食物',
      'GET /api/foods/with-shelf-life-status': '获取带保质期状态的所有食物',
      'GET /api/foods/shelf-life-status/:status': '根据保质期状态获取食物',
      'GET /api/foods/stats/shelf-life': '获取保质期状态统计',
      // 食品种类管理 API
      'GET /api/food-categories': '获取所有食品种类',
      'GET /api/food-categories/options': '获取格式化的种类选项（用于前端下拉选择）',
      'GET /api/food-categories/stats': '获取食品种类统计信息',
      'GET /api/food-categories/:id': '根据ID获取食品种类详情',
      'GET /api/food-categories/value/:typeValue': '根据type_value获取食品种类详情',
      'POST /api/food-categories': '创建食品种类',
      'POST /api/food-categories/batch': '批量创建食品种类',
      'PUT /api/food-categories/:id': '更新食品种类',
      'DELETE /api/food-categories/:id': '删除食品种类',
      'GET /api/food-categories/search/:keyword': '搜索食品种类',
      // 商品管理系统 API
      'GET /api/goods': '获取所有商品分类及商品列表（与api/goods.js相同格式）',
      'GET /api/goods/all': '获取商品列表（扁平结构，支持分类ID和名称查询）',
      'GET /api/goods/by-sales': '根据销量排行获取前7个商品',
      'GET /api/goods/:id': '获取商品详情',
      'POST /api/goods': '创建新商品（支持规格和规格值选择）',
      // 商品规格管理 API
      'GET /api/goods-properties': '获取规格列表（支持商品ID和分类ID筛选）',
      'GET /api/goods-properties/stats': '获取规格统计信息',
      'POST /api/goods-properties/:goodsId': '为商品创建规格',
      'PUT /api/goods-properties/:propertyId': '更新商品规格',
      'DELETE /api/goods-properties/:propertyId': '删除商品规格',
      'POST /api/goods-properties/:propertyId/values': '为规格创建规格值',
      'PUT /api/goods-properties/values/:valueId': '更新规格值',
      'DELETE /api/goods-properties/values/:valueId': '删除规格值',
      // 商品分类管理 API
      'GET /api/goods-categories': '获取全部商品分类（支持名称查询）',
      'GET /api/goods-categories/options': '获取分类选项（用于下拉选择）',
      'GET /api/goods-categories/:id': '获取单个商品分类详情',
      'POST /api/goods-categories': '创建新商品分类',
      'PUT /api/goods-categories/:id': '更新商品分类',
      'DELETE /api/goods-categories/:id': '删除商品分类'
    }
  });
});

// 错误处理中间件
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).json({ error: '服务器内部错误' });
});

// 404 处理
app.use('*', (req, res) => {
  res.status(404).json({ error: '路由未找到' });
});

// 启动服务器
async function startServer() {
  try {
    // 测试数据库连接
    await testConnection();
    
    // 初始化数据库表（如果需要）
    // await initializeDatabase(); // 已注释：启动时不自动初始化数据库
    
    app.listen(PORT, () => {
      console.log(`🚀 服务器运行在 http://localhost:${PORT}`);
      console.log(`📊 数据库：MySQL (3306端口)`);
      console.log(`🔗 API 测试：访问 http://localhost:${PORT}/ 查看端点信息`);
    });
  } catch (error) {
    console.error('❌ 服务器启动失败:', error.message);
    console.log('请检查数据库配置和连接');
    process.exit(1);
  }
}

startServer();
